const { Controller } = require('egg');

class HomeController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = 'hi, egg';
  }
  async addUser() {
    const { ctx } = this;
    // ctx.body = '新增用户';

    const { name, pwd } = ctx.request.body;
    if (!name) return ctx.body = { success: false, info: '用户名不能为空' };
    if (!pwd) return ctx.body = { success: false, info: '密码不能为空' };
    await ctx.model.User.create({
      username: name,
      pwd,
    });
    ctx.body = { success: true, info: '创建成功' };
  }

  // 删
  async delUser() {
    const { ctx } = this;
    const { uid } = ctx.request.body;
    await ctx.model.User.destroy({
      where: {
        uid,
      }
    })
    ctx.body = { success: true, info: '删除成功' }
  }

  // 改
  async updateUser() {
    const { ctx } = this;
    const { uid, ...newUserData } = ctx.request.body;

    await ctx.model.User.update(newUserData,
      {
        where: {
          uid,
        }
      }
    );
    ctx.body = '修改成功'
  }
  // 查一个
  async getUserInfo() {
    const { ctx } = this;

    // get请求通过query传参了 
    const { uid } = ctx.query

    // 通过主键查询
    // const UserInfo = await ctx.model.User.findByPk(uid)

    const UserInfo = await ctx.model.User.findOne({
      where: {
        uid,
      }
    })
    ctx.body = { info: '查询成功', data: UserInfo }
  }

  // 查全部
  async getAllUser() {
    const { ctx, app } = this;
    const { Op } = app.Sequelize; //Op对象是sequelize的操作符对象
    const { page = 1, limit = 10 } = ctx.query
    // limit = limit || 10
    // page = page || 1

    const offset = (page-1) * limit


    // hasOne 1v1  hasMany 1v多
    // 如果外键在要关联的表上面 使用hasOne或者hasMany
    await ctx.model.User.hasMany(ctx.model.Order, {
      foreignKey: 'uid',
    });

    const user = await ctx.model.User.findAll({
      limit, //限制查询的记录  给3就查询3条数据
      offset, //跳过前面指定条数开始查询。 给10就 从第10条开始查。
      // attributes: ['uid', 'username'] //只查询 uid username
      attributes: { //排除
        exclude: [ 'pwd' ] // 不查询 pwd
      },
      order: [ [ 'uid', 'DESC' ] ], //倒序查询 从大到小
      // order: [ [ 'uid', 'ASC' ] ] //顺序查询 从小到大
      where: {
        // uid: 22, //查询uid=22的数据

        // Op.lt 小于 Op.gt大于  Op.lte小于等于  Op.gte 大于等于
        // uid: { [Op.lt]: 50 } 
        // uid: { [Op.between]: [ 20, 25 ]}, //大于等于且小于等于
        // username: { [ Op.like ]: 'd%' } //模糊查询
        // [Op.or]: { //多条件 或查询
        //   uid: {
        //     [Op.gt]: 50,
        //   },
        //   username: {
        //     [Op.like]: 'd%',
        //   }
        // }
      },
      include: [
        {
          model: ctx.model.Order,
        },
      ],
    })
    ctx.body = { info: '查询全部', data: user }
  }


  async getAllOrder() {
    const { ctx } = this;

    // 如果外键在 要查询的表上面 使用belongsTo
    await ctx.model.Order.belongsTo(ctx.model.User, {
      foreignKey: 'uid',
    });
    const orderInfo = await ctx.model.Order.findAll({
      include: [
        { model: ctx.model.User}
      ]
    })
    ctx.body = {info: '查询订单', data: orderInfo}
  }
}

module.exports = HomeController;
